//
//  HMHTTPClient.swift
//  WeiBo
//
//  Created by apple on 16/6/23.
//  Copyright © 2016年 itheima. All rights reserved.
//

import UIKit
import AFNetworking

enum ClientType: String{
    
    case  GET = "GET"
    case  POST = "POST"
}

class HMHTTPClient: AFHTTPSessionManager {

    
    // 可以在这里创建一个单例类,利于我们管理
    
    static let shareInstance: HMHTTPClient = {
    
        let client = HMHTTPClient()
        // 我们的网络请求的客户端不能识别 text/plain,需要设置一下才能对数据进行解析
        client.responseSerializer.acceptableContentTypes?.insert("text/plain")
        
        return client
    }()
    
    // 把 init方法设置成 private
    private init(){
    
        // 必须要调用指定的构造函数
        // 指定构造方法,不用可以去记
        super.init(baseURL: nil, sessionConfiguration: nil)
        
    }

    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
 
    /*
        网络请求类: GET & POST

    
    override func GET(URLString: String, parameters: AnyObject?, progress downloadProgress: ((NSProgress) -> Void)?, success: ((NSURLSessionDataTask, AnyObject?) -> Void)?, failure: ((NSURLSessionDataTask?, NSError) -> Void)?) -> NSURLSessionDataTask? {
        
    }
    
    
    override func POST(URLString: String, parameters: AnyObject?, progress uploadProgress: ((NSProgress) -> Void)?, success: ((NSURLSessionDataTask, AnyObject?) -> Void)?, failure: ((NSURLSessionDataTask?, NSError) -> Void)?) -> NSURLSessionDataTask? {
        
    }
    */
    
    // 把get和 post 集合成了一个
    func request(type: ClientType,URLString: String, parameters: AnyObject?, progress uploadProgress: ((NSProgress) -> Void)?, success: ((NSURLSessionDataTask, AnyObject?) -> Void)?, failure: ((NSURLSessionDataTask?, NSError) -> Void)?){
        
        
        
        if type == .GET{
            
            self.GET(URLString, parameters: parameters, progress: uploadProgress, success: success, failure: failure)
        } else if type == .POST {
            self.POST(URLString, parameters: parameters, progress: uploadProgress, success: success, failure: failure)
        }
        
    }
    
    // 通过方法重载,来减少参数,方便其他人员调用
    func request(type: ClientType,URLString: String, parameters: AnyObject?, success: ((NSURLSessionDataTask, AnyObject?) -> Void)?, failure: ((NSURLSessionDataTask?, NSError) -> Void)?){
        
            self.request(type, URLString: URLString, parameters: parameters, progress: nil, success: success, failure: failure)
            
        
        
    }
    
    
//    // 需要通过方法重载对 返回成功的回调,以及 失败的回调 返回参数进行减少
//    func request(type: ClientType,URLString: String, parameters: AnyObject?, progress uploadProgress: ((NSProgress) -> Void)?, success: ( AnyObject?) -> Void, failure: ( NSError) -> Void){
//        
//        // 我们需要定义一个闭包,来传递到网络请求里
//        let getSuccess = { (task: NSURLSessionDataTask,json: AnyObject?) -> Void in
//        
//            // 当网络请求成功之后,回调会走到这里
//            // 想一想 方法里 success 会执行吗???
//            success(json)
//        }
//        
//        // 和网络请求成功的回调同理
//        let getFailure = { (task: NSURLSessionDataTask?,error: NSError) -> Void in
//        
//            failure(error)
//            
//        }
//        // 需要去调用网络请求
//        self.GET(URLString, parameters: parameters, progress: nil, success: getSuccess, failure: getFailure)
//        
//        
//        
//    }
    
    
    
    ///  抽取的最终方法,没有进度,没有urlSessionDataTask
    ///
    ///  - parameter type:       网络请求方法
    ///  - parameter URLString:  请求地址
    ///  - parameter parameters: 请求参数
    ///  - parameter success:    成功回调,返回JSON
    ///  - parameter failure:    失败回调,返回错误信息
    /// 需要通过方法重载对 返回成功的回调,以及 失败的回调 返回参数进行减少
    func request(type: ClientType,URLString: String, parameters: AnyObject?, success: AnyObject? -> Void, failure:  NSError -> Void){
        
        // 我们需要定义一个闭包,来传递到网络请求里
        let getSuccess = { (task: NSURLSessionDataTask,json: AnyObject?) -> Void in
            
            let jsonDict = json as? [String: AnyObject]
            
            // 当网络请求成功之后,回调会走到这里
            // 想一想 方法里 success 会执行吗???
            success(json)
        }
        
        // 和网络请求成功的回调同理
        let getFailure = { (task: NSURLSessionDataTask?,error: NSError) -> Void in
            
            failure(error)
            
        }
        
//        parameters["access_token"] = "token"
        
        self.request(type, URLString: URLString, parameters: parameters, progress: nil, success: getSuccess, failure: getFailure)
        
        
        
    }

    
    // MARK:-- 类方法
    class func request(type: ClientType,URLString: String, parameters: AnyObject?, success: AnyObject? -> Void, failure:  NSError -> Void) {
        
        // 类方法想调用对象方法,需要一个对象实例
        HMHTTPClient.shareInstance.request(type, URLString: URLString, parameters: parameters, success: success, failure: failure)
    }
}
